package br.com.eurotrader.controller;


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.jkjkj
 */
import br.com.eurotrader.componentes.BeanDataTable;
import br.com.eurotrader.dao.UsuarioDao;
import br.com.eurotrader.entidades.Usuario;
import br.com.eurotrader.utils.Criptografar;
import br.com.eurotrader.utils.FacesUtils;
import br.com.eurotrader.componentes.BeanEstadoCidade;
import com.icesoft.faces.component.ext.HtmlDataTable;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;

/**
 *
 * @author Edmilson
 */
@ViewScoped
@ManagedBean
public class CadGerUsuarioController extends BaseController<Usuario, Integer> implements Serializable {

    @EJB
    private UsuarioDao usuarioDao;
    @EJB
    private CadGerPerfilController cadGerPerfilController;

    public CadGerUsuarioController() {
    }

    @PostConstruct
    public void inicializar() {
        setObjeto(new Usuario());
        setObjetoDao(usuarioDao);
        setColunasTabela("Id", "id");
        setColunasTabela("Data Inclusão", "dataInclusao");
        setColunasTabela("Nome Cliente", "nomePessoa");
        setColunasTabela("Usuário", "usuario");
        setColunasTabela("CPF", "cpf");
        setColunasTabela("Cidade", "cidadeId.descricao");
        setColunasTabela("Situação", "situacao");

    }

    public void atualizarManual(Usuario usuario) {
        setObjeto(usuario);
        atualizar(null);
    }

    @Override
    public void visualizandoORegistro() {
        if (getObjeto().getId() != null) {
            setSenha("1alterando");
            setConfirmaSenha("1alterando");
        } else {
            getObjeto().setDataInclusao(new Date());
            setSenha(null);
            setConfirmaSenha(null);
        }

        BeanEstadoCidade beanEstadoCidade = (BeanEstadoCidade) FacesUtils.getManagedBean("beanEstadoCidade");
        if (getObjeto().getId() != null) {
            beanEstadoCidade.setEstadoSelecionado(getObjeto().getCidadeId().getEstadoId());
        } else {
            beanEstadoCidade.setEstadoSelecionado(null);
        }

        BeanDataTable beanDataTable = (BeanDataTable) FacesUtils.getManagedBean("beanDataTable");

        beanDataTable.setDataTable1(new HtmlDataTable());

    }

    
    @Override
    public Object getDadosLinhas(int col, DataModel rowModel) {
        if (rowModel.isRowAvailable()) {
            if (col == 0) {
                return ((Usuario) rowModel.getRowData()).getId();
            }
            
            
            
            
            if (col == 1) {
                return FacesUtils.retornaDataHoraFormatada(((Usuario) rowModel.getRowData()).getDataInclusao());
            }
            if (col == 2) {
                return ((Usuario) rowModel.getRowData()).getNomePessoa();
            }
            if (col == 3) {
                return ((Usuario) rowModel.getRowData()).getUsuario();
            }
            if (col == 4) {
                return ((Usuario) rowModel.getRowData()).getCpf();
            }
            if (col == 5) {
                return ((Usuario) rowModel.getRowData()).getCidadeId().getDescricao();
            }            
            if (col == 6) {
                String situacao = ((Usuario) rowModel.getRowData()).getSituacao();
                if (situacao.equals("A")){
                    return "A - Ativo";
                } else{
                    return "I - Inativo";
                }
            }
        }

        return null;
    }

    @Override
    public Usuario getObjeto() {
        return super.getObjeto();
    }

    @Override
    public void setObjeto(Usuario objeto) {
        super.setObjeto(objeto);
    }

   
    private String senha;
    private String senhaAtual;
    private String confirmaSenha;

    public String getConfirmaSenha() {
        return confirmaSenha;
    }

    public void setConfirmaSenha(String confirmaSenha) {
        this.confirmaSenha = confirmaSenha;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getSenhaAtual() {
        return senhaAtual;
    }

    public void setSenhaAtual(String senhaAtual) {
        this.senhaAtual = senhaAtual;
    }


    public boolean validarSenha(String senha, String confirmarSenha) {
        if (!(senha.equals(confirmarSenha.trim()))) {
            FacesUtils.addInfoMessage("Senhas não conferem.  Redigite as senhas nos campos.");
            return false;
        }

        if (senha.equals("123456")) {
            FacesUtils.addInfoMessage("Senha 123456. Escolha outra senha.");
            return false;
        }
        if (senha.equals("1234567")) {
            FacesUtils.addInfoMessage("Senha 1234567. Escolha outra senha.");
            return false;
        }
        if (senha.equals("12345678")) {
            FacesUtils.addInfoMessage("Senha 12345678. Escolha outra senha.");
            return false;
        }
        if (senha.equals("123456789")) {
            FacesUtils.addInfoMessage("Senha 123456789. Escolha outra senha.");
            return false;
        }
        if (senha.equals("0123456789")) {
            FacesUtils.addInfoMessage("Senha 0123456789. Escolha outra senha.");
            return false;
        }


        return true;
    }

    @Override
    public Boolean validacoes(ActionEvent event) {
        //return super.validacoes();
        if ((senha != null) && (confirmaSenha != null) && (!senha.trim().isEmpty())) {
            if ((getObjeto().getId() != null) && (!senha.trim().equals("1alterando"))) {
                getObjeto().setSenha(senha.trim());
            }
            if (!validarSenha(senha.trim(), confirmaSenha.trim())) {
                return false;
            }


        } else {
            getObjeto().setSenha("123456");
        }


        String clausulaNumUsuario = "";
        if (getObjeto().getId() != null) {
            clausulaNumUsuario = " AND u.id <> " + getObjeto().getId();
        }
        if (getObjetoDao().encontrouRegistro("SELECT u.id FROM Usuario u WHERE upper(u.usuario) = '" + getObjeto().getUsuario().trim().toUpperCase() + "'"
                + clausulaNumUsuario)) {
            FacesUtils.addInfoMessage("Usuário existente! Escolha outro email para o usuário.");
            return false;
        }

        

//        if ((getObjeto().getValorTotalFinal() != null) && (getObjeto().getValorTotalFinal().compareTo(BigDecimal.ZERO) < 0)) {
//            FacesUtils.addInfoMessage("O valor total não pode ser menor que zero.");
//            return false;
//        }


        try {
            if ((getObjeto().getId() == null) || (!senha.trim().equals("1alterando"))) {
                getObjeto().setSenha(Criptografar.md5(senha));
            }
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(CadGerUsuarioController.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }


//        salvarCheckBoxs();
//        if (getObjeto().getId() == null) {
//            getObjeto().setDataInclusao(new Date());
//        }

        if (getObjeto().getPerfilId() == null) {
            getObjeto().setPerfilId(cadGerPerfilController.buscaPorCampo("descricao", "ROLE_USUARIO"));
        }



//        if (getObjeto().getAtivo()) {
//            getObjeto().setSituacao("A");
//        } else {
//            getObjeto().setSituacao("I");
//        }



        senha = "1alterando";
        confirmaSenha = "1alterando";
        return true;



    }

//
//    private boolean atualizarChecks = true;
//
//      public void salvarCheckBoxs() {
//    
//       
//       InterfaceControllerCollection interfaceController = (InterfaceControllerCollection) ((MetodosBotoes) FacesUtils.getManagedBean("botoes")).getControllerPagina();
//
//       Collection collec = interfaceController.getCollection();
//
//      
//      //Collection collec = getObjeto().getPerfilCollection();
//
//        CadGerPerfilController controllerPerfil =   (CadGerPerfilController) FacesUtils.getManagedBean("CadGerPerfilController");
//        //Boolean valor = (Boolean) checkBoxIncluir.getValue();
//        System.out.println("VALOR INSERIR "+valorInserir + " - "+checkBoxIncluir.getValue());
//        System.out.println("VALOR ALTERAR "+valorAlterar + " - "+checkBoxAlterar.getValue());
//        System.out.println("VALOR EXCLUIR "+valorExcluir + " - "+checkBoxExcluir.getValue());
//
//        if (valorInserir == true) {
//            checkBoxIncluir.setValue(true);
//
//            Perfil obj =  controllerPerfil.getObjetoDao().getResultadoSimples("Select p From Perfil p Where p.descricao = 'ROLE_INSERIR'");
//             //if(!getObjeto().getPerfilCollection().contains(obj)){
//                collec.add(obj);
//             //}
//            
//        }
//        if (valorAlterar == true) {
//            checkBoxAlterar.setValue(true);
//
//            Perfil obj =  controllerPerfil.getObjetoDao().getResultadoSimples("Select p From Perfil p Where p.descricao = 'ROLE_ALTERAR'");
//            //if(!getObjeto().getPerfilCollection().contains(obj)){
//                collec.add(obj);
//            //}
//            
//        }
//        if (valorExcluir == true) {
//
//            Perfil obj =  controllerPerfil.getObjetoDao().getResultadoSimples("Select p From Perfil p Where p.descricao = 'ROLE_EXCLUIR'");
//            //if(!getObjeto().getPerfilCollection().contains(obj)){
//                collec.add(obj);
//            //}
//            
//        }
//
//        getObjeto().setPerfilCollection(collec);
//         
//    }
//    
//
//    @Inject
//    private UsuarioDaoImp usuarioDao;
//    @Inject @DaoUsuario
//    private BaseDao<Usuario, Integer> usuarioDao;
//    public CadGerUsuarioController() {
//        //   UsuarioDao usuarioDao = (UsuarioDao) FacesUtils.getManagedBean("usuarioDao");
//        //   System.out.println("" + usuarioDao.getClass());
////        setColunasTabela("CÃ³digo", "codigo");
////        setColunasTabela("DescriÃ§Ã£o", "descricao");
////        setColunasTabela("UF", "uf");
////        setColunasTabela("CÃ³d IBGE", "cod_ibge");
////        setColunasTabela("PaÃ­s", "pais.descricao");
//    }
//    public BaseDao<Usuario, Integer> getObjetoDao() {
//        return usuarioDao;
//    }
//    public List pesquisar(String sql) {
//        //  System.out.println("acadao" + usuarioDao.getClass());
//        return usuarioDao.pesq(sql, "");
//        // return pesq(sql, "");
//    }
//  private Usuario usuario;
//
//    public Usuario getUsuario() {
//        return usuario;
//    }
//
//    public void setUsuario(Usuario usuario) {
//        this.usuario = usuario;
//    }
//    @Override
//    public Object getDadosLinhas(int col, DataModel rowModel) {
//
//        if (col == 1) {
//            return ((Estado) rowModel.getRowData()).getDescricao();
//        }
//        if (col == 2) {
//            return ((Estado) rowModel.getRowData()).getUf();
//        }
//        if (col == 3) {
//            return ((Estado) rowModel.getRowData()).getCod_ibge();
//        }
//        if (col == 4) {
//            return ((Estado) rowModel.getRowData()).getPais().getDescricao();
//        }
//        return null;
//    }
//
//    @PersistenceContext
//    private EntityManager entityManager;
//    private Class<Usuario> persistentClass;
//    private static Logger log;
//
//    public Class<Usuario> getPersistentClass() {
//        return persistentClass;
//
//    }
//
//    public EntityManager getEntityManager() {
//        return entityManager;
//    }
//
//    public void setEntityManager(EntityManager entityManager) {
//        this.entityManager = entityManager;
//    }
//
//    public List pesq(String query, String ordenusuario) {
//        try {
//            return getEntityManager().createQuery(query + " " + ordenusuario).getResultList();
//        } catch (javax.persistence.NoResultException e) {
//            return null;
//        }
//    }
//    private List<Usuario> listaDeAcoesAtuais = null;
//
//    public List<Usuario> getListaDeAcoesAtuais() {
//        return listaDeAcoesAtuais;
//    }
//
//    public void setListaDeAcoesAtuais(List<Usuario> listaDeAcoesAtuais) {
//        this.listaDeAcoesAtuais = listaDeAcoesAtuais;
//    }
//
//     public List<SelectItem> getAcoes() {
//         List<SelectItem> items = new ArrayList<SelectItem>();
//       // if (listaDeAcoesAtuais == null) {
//            System.out.println("---------------------------------------");
//            System.out.println(" preenchendo a lista com o que esta no banco de dados");
//            System.out.println("---------------------------------------");
//            CadGerUsuarioController usuarioController = (CadGerUsuarioController) FacesUtils.getManagedBean("usuarioController");
//            // usuarioController.limparMemoria();
//            // UsuarioDao usuarioDao = (UsuarioDao) FacesUtils.getManagedBean("usuarioDao");
//            //  System.out.println("" +  usuarioDao.getClass());
//            listaDeAcoesAtuais = usuarioController.pesquisar("SELECT a FROM Usuario a");
////            for (Usuario usuario : listaDeAcoesAtuais) {
////                System.out.println("usuario ---- " + usuario.getDescricao());
////                usuario.setAdviseABE(conv.startAdvise(usuario.getDescricao() + ".ABE", adviseDataListener));
////                usuario.setAdviseMIN(conv.startAdvise(usuario.getDescricao() + ".MIN", adviseDataListener));
////                usuario.setAdviseMAX(conv.startAdvise(usuario.getDescricao() + ".MAX", adviseDataListener));
////                usuario.setAdviseULT(conv.startAdvise(usuario.getDescricao() + ".ULT", adviseDataListener));
////            }
//            //adicionarAcoesPadrao();
//            for (Usuario e : listaDeAcoesAtuais) {
//                items.add(new SelectItem(e, e.getNomePessoa()));
//            }
//
//        //}
//        return items;
//    }
//
//
//    public void salvar(ActionEvent event){
//        try {
//            usuario = new Usuario();
//            usuario.setAtivo(true);
//            usuario.setDataInclusao(new Date());
//            usuario.setNomePessoa("Edmilson 2");
//            usuario.setUsuario("edmilson2");
//            usuario.setSenha(Criptografar.md5("verona"));
//            usuario.setSituacao("A");
//            usuarioDao.save(usuario);
//        } catch (NoSuchAlgorithmException ex) {
//            Logger.getLogger(CadGerUsuarioController.class.getName()).log(Level.SEVERE, null, ex);
//        }
//    }
//
//    public void atualizar(ActionEvent event){
//     //   usuario.setDescricao("TESTE ATUALIZADO");
//        usuarioDao.update(usuario);
//    }
//
//    public void deletar(ActionEvent event){
//        usuarioDao.delete(usuario);
//    }
//    public void salvar(Usuario usuario) {
//        try {
//            usuario.setSenha(Criptografar.md5(usuario.getSenha().trim()));
//        } catch (NoSuchAlgorithmException ex) {
//            Logger.getLogger(CadGerUsuarioController.class.getName()).log(Level.SEVERE, null, ex);
//        }
//        usuarioDao.save(usuario);
//    }
//    public void atualizar(Usuario usuario) {
//        System.out.println("usuario " + usuario.getNomePessoa());
//        System.out.println("usuario termos " + usuario.getAceitouTermos());
//        usuarioDao.update(usuario);
//    }
//
//    public void deletar(Usuario usuario) {
//        usuarioDao.delete(usuario);
//    }
//    public Usuario buscaUsuario(String usuario, String senha) throws NoSuchAlgorithmException {
//        String senhaCriptografada = Criptografar.md5(senha);
//        return  usuarioDao.getResultadoSimples("SELECT u FROM Usuario u WHERE u.usuario = '" + usuario + "'" +
//                " AND u.senha = '" + senhaCriptografada + "'");
//    }
    public Usuario buscaUsuario(String usuario, String senha) throws NoSuchAlgorithmException {
        // String senhaCriptografada = Criptografar.md5(senha);
        // FilialController filialController = (FilialController) Beans.getBean("FilialController");
        System.out.println(usuario + " - " + senha);
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("user", usuario);
        params.put("senha", Criptografar.md5(senha));
        System.out.println(usuario + " - " + Criptografar.md5(senha));
        return (Usuario) usuarioDao.listPesqParamSimples("SELECT u FROM Usuario u WHERE u.usuario = :user AND u.senha = :senha", params);
    }

//    public void alterarSenha(ActionEvent event) {
//        AcoesDoUsuario acoesDoUsuario = (AcoesDoUsuario) FacesUtils.getManagedBean("acoesDoUsuario");
//        try {
//            if ((senhaAtual == null) || (senhaAtual.equals(""))) {
//                FacesUtils.addInfoMessage("A senha atual deve ser digitada.");
//                return;
//            }
//
//            Usuario usuarioCadastrado = buscaUsuario(acoesDoUsuario.getUsuarioConectado().getUsuario(), senhaAtual);
//            if (usuarioCadastrado == null) {
//                FacesUtils.addInfoMessage("Senha atual esta incorreta.");
//                return;
//            }
//
//            if ((senha == null) || (confirmaSenha == null) || (senha.trim().isEmpty())) {
//                FacesUtils.addInfoMessage("Digite as senhas corretamente.");
//                return;
//            }
//
//            acoesDoUsuario.getUsuarioConectado().setSenha(senha);
//            if (!validarSenha(acoesDoUsuario.getUsuarioConectado().getSenha(), confirmaSenha)) {
//                return;
//            }
//
//            acoesDoUsuario.getUsuarioConectado().setSenha(Criptografar.md5(acoesDoUsuario.getUsuarioConectado().getSenha()));
//        } catch (NoSuchAlgorithmException ex) {
//            Logger.getLogger(CadGerUsuarioController.class.getName()).log(Level.SEVERE, null, ex);
//            return;
//        }
//        getObjetoDao().update(acoesDoUsuario.getUsuarioConectado());
//        acoesDoUsuario.setRendererAlterarSenhaSalva(false);
//        acoesDoUsuario.setRendererPrimeiroAcesso(false);
//        senha = null;
//        senhaAtual = null;
//        confirmaSenha = null;
//    }
//
//    public void cancelarAlteracoes(ActionEvent event) {
//        AcoesDoUsuario acoesDoUsuario = (AcoesDoUsuario) FacesUtils.getManagedBean("acoesDoUsuario");
//        acoesDoUsuario.setRendererAlterarSenhaSalva(false);
//        acoesDoUsuario.setRendererPrimeiroAcesso(false);
//        senha = null;
//        senhaAtual = null;
//        confirmaSenha = null;
//    }
//
//    public void definirSenha(ActionEvent event) {
//        AcoesDoUsuario acoesDoUsuario = (AcoesDoUsuario) FacesUtils.getManagedBean("acoesDoUsuario");
//
//        if (!acoesDoUsuario.getUsuarioConectado().getAceitouTermos().equals("true")) {
//            FacesUtils.addInfoMessage("Termos de uso. Deve-se lêr e marcar o campo aceitando os termos de uso.");
//            return;
//        }
//
//        try {
//            if ((senha == null) || (confirmaSenha == null) || (senha.trim().isEmpty())) {
//                FacesUtils.addInfoMessage("Digite as senhas corretamente.");
//                return;
//            }
//
//            acoesDoUsuario.getUsuarioConectado().setSenha(senha);
//            if (!validarSenha(acoesDoUsuario.getUsuarioConectado().getSenha(), confirmaSenha)) {
//                return;
//            }
//
//            acoesDoUsuario.getUsuarioConectado().setSenha(Criptografar.md5(acoesDoUsuario.getUsuarioConectado().getSenha()));
//        } catch (NoSuchAlgorithmException ex) {
//            Logger.getLogger(CadGerUsuarioController.class.getName()).log(Level.SEVERE, null, ex);
//            return;
//        }
//        getObjetoDao().update(acoesDoUsuario.getUsuarioConectado());
//        acoesDoUsuario.setRendererPrimeiroAcesso(false);
//        senha = null;
//        senhaAtual = null;
//        confirmaSenha = null;
//    }
//
    public void navegar(ActionEvent event) {
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect("cadGerUsuario.jsf");
        } catch (IOException ex) {
            Logger.getLogger(CadGerUsuarioController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

   
}
